import { defineConfig,ProxyOptions } from 'vite'
import { VITE_DROP_CONSOLE,VITE_PORT,API_BASE_URL,API_TARGET_URL,MOCK_API_BASE_URL,MOCK_API_TARGET_URL } from './config/constant';
import {createVitePlugin} from "./config/plugin";
import {configManualChunk} from "./config/optimizer";

const { resolve } = require('path')

// https://vitejs.dev/config/
type ProxyTargetList = Record<string, ProxyOptions>

const proxy:ProxyTargetList = { // 为开发服务器配置自定义代理规则
  // 选项写法
  [API_BASE_URL]: {
    target: API_TARGET_URL, //代理接口
    changeOrigin: true,
    rewrite: (path) => path.replace(new RegExp(`^${API_BASE_URL}`), '')
  },
  [MOCK_API_BASE_URL]: {
    target: MOCK_API_TARGET_URL, //代理接口
    changeOrigin: true,
    rewrite: (path) => path.replace(new RegExp(`^${MOCK_API_BASE_URL}`), '')
  }
}

export default defineConfig({
  base:'./',
  plugins: createVitePlugin(),
  resolve: {
    extensions: ['.js', '.ts', '.jsx', '.tsx', '.json', '.vue'],
    alias: {
      '@': resolve(__dirname, 'src')
    }
  },
  optimizeDeps: {
    include: ['axios', 'mockjs'], // 引入第三方的配置,强制预构建插件包 'echarts' 等
  },
  build: {
    target: 'es2015', // 设置最终构建的浏览器兼容目标。modules:支持原生 ES 模块的浏览器
    outDir: 'dist', // 指定输出路径
    assetsDir: 'assets', // 指定生成静态资源的存放路径
    sourcemap: false, // 构建后是否生成 source map 文件
    minify: 'terser', // 混淆器，terser构建后文件体积更小
    chunkSizeWarningLimit: 1000, // 打包限制大小
    rollupOptions: { // 将大块分解成更小的块
      output:{
        manualChunks:configManualChunk
      }
    },
    terserOptions: {
      // 生产环境移除console
      compress: {
        keep_infinity:true,
        drop_console: VITE_DROP_CONSOLE,
        drop_debugger: true,
      },
    },
  },
  server: {
    hmr: { overlay: false }, //禁用或配置 HMR 连接 设置 server.hmr.overlay 为 false 可以禁用服务器错误遮罩层
    host: '0.0.0.0', // 指定服务器主机名
    port: VITE_PORT, // 指定服务器端口
    open: true, // 在服务器启动时自动在浏览器中打开应用程序
    strictPort: false, // 设为 false 时，若端口已被占用则会尝试下一个可用端口,而不是直接退出
    https: false, // 是否开启 https
    cors: false, // 为开发服务器配置 CORS。默认启用并允许任何源
    proxy
  },
  css: {
    // css预处理器
    preprocessorOptions: {
      less: {
        charset: false,
        additionalData: '',
        // @import "./src/assets/style/global.less";
      },
    }
  },
})
